package clases;
import java.awt.Color;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

import javax.swing.JOptionPane;

import org.apache.poi.hssf.record.RecalcIdRecord;
import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;

import com.itextpdf.text.Anchor;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chapter;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.List;
import com.itextpdf.text.ListItem;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.Section;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPRow;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.codec.Base64.InputStream;
import com.itextpdf.text.pdf.fonts.otf.TableHeader;

public class CV_imprimir {
	
	private String codigoficha;
	private ResultSet resultado;
	private Ficha_class ficha;
	private conyuges_class conyuge;
	private datosfamiliares_class familiares;
	private Educacion_class educacion;
	private Empleoanterior_class experiencia;
	private Idiomas_class idiomas;
	private Licencias_class licencia;
	private Referencias_class personales;
	private Paragraph parrafo;
	private String query;
	private ArrayList<String> parametros;
	private utilidades_class utilidades;
	
	//DOCUMENTO
	private Document documento;
	private PdfPTable tabla;
	private PdfPCell celda;
	
	
	//FUENTES
	private static String ARCHIVO = System.getProperty("user.dir")+"\\dir\\FirstPdf.pdf";
	  private static Font ftitulo = new Font(Font.FontFamily.TIMES_ROMAN, 14,
	      Font.BOLD, BaseColor.BLUE);
	  private static Font fsubtitulo = new Font(Font.FontFamily.TIMES_ROMAN, 12,
	      Font.BOLD);
	  private static Font fcontenido = new Font(Font.FontFamily.TIMES_ROMAN, 10,
	      Font.BOLD);
	  
	  public void crearDocumento(String codigoficha)
	  {
		  this.codigoficha=codigoficha;
		  this.utilidades=new utilidades_class();
		  utilidades.crearCarpetaReportes();
		  try
		  {
			  documento = new Document();
			  PdfWriter.getInstance(documento, new FileOutputStream(ARCHIVO));
			  documento.open();
			  datosGenerales();
		  }catch(Exception ex)
		  {
			  JOptionPane.showMessageDialog(null, ex.toString());
		  }
	  }
	  
	  
	  public void datosGenerales()
	  {
		  try
		  {
			  System.out.println("Generales");
			  resultado = new Ficha_class(codigoficha).mostrar();
			  resultado.next();
			  
			  tabla = new PdfPTable(2);
			  
			  tabla.setWidthPercentage(90);
			  float[] anchos = {1f,1f};
			  tabla.setWidths(anchos);
			  
			  //DATOS GENERALES
			  celda = new PdfPCell(new Paragraph(resultado.getString("nombres")+" "+resultado.getString("primerapellido")+ " "+resultado.getString("segundoapellido")+"\n"+
					  			   utilidades.mostrarfecha(resultado.getDate("fechanacimiento"))+"\n"+
					  			   resultado.getString("direccion")+"\n"+
					  			   resultado.getString("telefono")));
			  celda.setBorder(Rectangle.NO_BORDER);
			  celda.setHorizontalAlignment(Element.ALIGN_LEFT);
			  tabla.addCell(celda);
			  
			  //FOTO
			  File archivofoto = new File(System.getProperty("user.dir")+"\\src\\fotos\\"+codigoficha+".png");
			  if(archivofoto.exists())
			  {
				  Image foto = Image.getInstance(System.getProperty("user.dir")+"\\src\\fotos\\"+codigoficha+".png");
				  foto.scalePercent(10);
				  celda = new PdfPCell(foto);
				  celda.setBorder(Rectangle.NO_BORDER);
				  celda.setHorizontalAlignment(Element.ALIGN_RIGHT);
//				  tabla.addCell(celda);
			  }
			  else
			  {
				  celda = new PdfPCell(new Phrase());
				  celda.setBorder(Rectangle.NO_BORDER);
				  celda.setHorizontalAlignment(Element.ALIGN_RIGHT);
//				  tabla.addCell(celda);
			  }
			  
			  tabla.addCell(celda);
			  documento.add(tabla);
			  
			  insertarLineas(2);
			  estudios();
			  
			  
			  
		  }catch(Exception ex)
		  {
			  JOptionPane.showMessageDialog(null, ex.toString());
		  }
	  }
	  
	  
	  public void estudios()
	  {
		  System.out.println("Estudios");
		  try
		  {
			  documento.add(new Paragraph("Educacion", ftitulo));
			  query = "SELECT institucion, DATEPART(YEAR, hasta) AS hasta, titulo, grado FROM educacion  INNER JOIN gradosacademicos ON educacion.codigogrado=gradosacademicos.codigogrado" +
				  		" WHERE codigoficha=? ORDER BY hasta ASC";
			  
				  parametros = new ArrayList<String>();
				  parametros.add(codigoficha);
				  resultado = new Educacion_class().consultaConnection(query, parametros);
				  while(resultado.next())
				  {
					  documento.add(new Paragraph(resultado.getString("grado")+"\r\t"+resultado.getString("hasta"),fsubtitulo));
					  documento.add(new Paragraph(resultado.getString("titulo"),fcontenido));
					  documento.add(new Paragraph(resultado.getString("institucion"),fcontenido));
					  insertarLineas(2);
				  }
				  
				  experiencia();
				  
		  }catch(Exception ex)
		  {
			  JOptionPane.showMessageDialog(null, ex.toString());
		  }
	  }
	  
	  public void experiencia()
	  {
		  System.out.println("Experiencia");
		  try
		  {
			  documento.add(new Paragraph("Experiencia Laboral",ftitulo));
			  
			  query = "SELECT empresa, direccion, telefono, nombrejefe, convert(varchar, inicio, 103) AS inicio, convert(varchar, fin, 103) AS fin, ultimosueldo, razonretiro, codigocargo FROM empleoanterior" +
			  		" WHERE codigoficha=? ORDER BY inicio ASC";
			  parametros = new ArrayList<String>();
			  parametros.add(codigoficha);
			  resultado = new Empleoanterior_class().mostrar(query, parametros);
			  while(resultado.next())
			  {
				PdfPTable tabla = new PdfPTable(2);
				PdfPCell celda = new PdfPCell(new Phrase());
				  
				  
				  documento.add(new Paragraph(resultado.getString("inicio")+" - "+resultado.getString("fin"),fsubtitulo));
				  documento.add(new Paragraph(resultado.getString("empresa"),fcontenido));
				  documento.add(new Paragraph(resultado.getString("direccion"),fcontenido));
				  documento.add(new Paragraph(resultado.getString("nombrejefe"),fcontenido));
				  documento.add(new Paragraph(resultado.getString("codigocargo"),fcontenido));
				  insertarLineas(2);
			  }
			  
			  //REFERENCIAS PERSONALES
			  idiomas();
			  
		  }catch(Exception ex)
		  {
			  JOptionPane.showMessageDialog(null, ex.toString());
		  }
	  }
	  
	  public void idiomas()
	  {
		  System.out.println("Idiomas");
		  try
		  {
			  documento.add(new Paragraph("Idiomas",ftitulo));
			  
			  query = "SELECT idioma, habla, lee, escribe FROM idiomas INNER JOIN clasificacionidiomas ON idiomas.codigoclasidioma=clasificacionidiomas.codigoclasificacion " +
			  		"WHERE codigoficha=?";
			  parametros = new ArrayList<String>();
			  parametros.add(codigoficha);
			  resultado = new Empleoanterior_class().mostrar(query, parametros);
			  
			  while(resultado.next())
			  {
				documento.add(new Paragraph(resultado.getString("idioma"),fsubtitulo));  
				documento.add(new Paragraph("Habla: "+resultado.getString("habla"),fcontenido));  
				documento.add(new Paragraph("Lee: "+resultado.getString("lee"),fcontenido));  
				documento.add(new Paragraph("Escribe: "+resultado.getString("escribe"),fcontenido));
				insertarLineas(1);
			  }
			  
			  referenciaspersonales();
		  }catch(Exception ex)
		  {
			  JOptionPane.showMessageDialog(null, ex.toString());
		  }
	  }
	  
	  
	  public void referenciaspersonales()
	  {
		  System.out.println("Referencias Personales");
		  try
		  {
			  documento.add(new Paragraph("Referencias Personales",ftitulo));
			  
			  query = "SELECT * FROM referencias WHERE codigoficha=?";
			  parametros = new ArrayList<String>();
			  parametros.add(codigoficha);
			  resultado = new Empleoanterior_class().mostrar(query, parametros);
			  while(resultado.next())
			  {
				 documento.add(new Paragraph(resultado.getString("nombre"),fsubtitulo));
				 documento.add(new Paragraph(resultado.getString("direccion"),fcontenido));
				 documento.add(new Paragraph(resultado.getString("telefono"),fcontenido));
				 insertarLineas(2);
			  }
			  documento.close();
			  buscarDocumentos();
			  
		  }catch(Exception ex)
		  {
			  JOptionPane.showMessageDialog(null, ex.toString());
		  }
	  }
	  
	  
	  
	  public void buscarDocumentos()
	  {
		  System.out.println("Buscar docs");
		  try
		  {
			  java.util.List<java.io.InputStream> list = new ArrayList<java.io.InputStream>();
			  query = "SELECT nombredoc FROM educacion WHERE codigoficha=? AND documento=?";
			  parametros = new ArrayList<String>();
			  parametros.add(codigoficha);
			  parametros.add("1");
			  resultado = new Educacion_class().consultaConnection(query, parametros);
			  list.add(new FileInputStream(System.getProperty("user.dir")+"\\dir\\FirstPdf.pdf"));
			  while(resultado.next())
			  {
				  list.add(new FileInputStream(System.getProperty("user.dir")+"\\src\\documentos\\"+(resultado.getString("nombredoc"))+".pdf"));
			  }
			  
			  System.out.println("Antes de agregar archivos");
			  OutputStream out = new FileOutputStream(new File(System.getProperty("user.dir")+"\\dir\\"+codigoficha+".pdf"));
			  
			  Document document = new Document();
		        PdfWriter writer = PdfWriter.getInstance(document, out);
		        document.open();
		        PdfContentByte cb = writer.getDirectContent();
		        System.out.println("A continuacion..");
		        for (java.io.InputStream in : list) {
		            PdfReader reader = new PdfReader(in);
		            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
		            	System.out.println("Agregando archivos");
		                document.newPage();
		                //import the page from source pdf
		                PdfImportedPage page = writer.getImportedPage(reader, i);
		                //add the page to the destination pdf
		                cb.addTemplate(page, 0, 0);
		            }
		        }
		        System.out.println("Despues de agregar");
		        out.flush();
		        document.close();
		        out.close();
		        System.out.println("Cerrado");
		        File borrar = new File(System.getProperty("user.dir")+"\\dir\\FirstPdf.pdf");
		        if (borrar.exists()) borrar.delete();
		        
//		        Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler "+(System.getProperty("user.dir")+"\\src\\documentos\\"+(educacion_tabla.getValueAt(educacion_tabla.getSelectedRow(), 1).toString()+""+codigo.getText()+".pdf")));
		        Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler "+(System.getProperty("user.dir")+"\\dir\\"+codigoficha)+".pdf");
		        
		    } catch (Exception e) {
	            JOptionPane.showMessageDialog(null, e.toString());
	        }
	  }
	  
	  
	  public void insertarLineas(int lineas) throws Exception
	  {
		  for(int i=0;i<lineas;i++)
		  {
			  documento.add(new Paragraph(" "));
		  }
	  }
	
}
